package com.babel.util.lide;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;

/**
 * 日期相关工具类
 * @author lyj
 * @date 2017年5月10日---下午5:29:41
 */
public class DateUtil {

    /** 年月日时分秒(无下划线) yyyyMMddHHmmss */
    public static final String dtLong = "yyyyMMddHHmmss";

    /** 完整时间 yyyy-MM-dd HH:mm:ss */
    public static final String simple = "yyyy-MM-dd HH:mm:ss";

    /** 完整时间 yyyy-MM-dd HH:mm*/
    public static final String simples = "yyyy-MM-dd HH:mm";

    /** 年月日(无下划线) yyyyMMdd */
    public static final String dtShort = "yyyyMMdd";

    /** 年月日(有下划线) yyyyMMdd */
    public static final String dtsShort = "yyyy-MM-dd";

    /** 月日,时分(有下划线) MM-dd HH:mm*/
    public static final String mdSM = " MM-dd HH:mm";

    /**
     * 返回系统当前时间(精确到毫秒),作为一个唯一的订单编号
     * @return
     *      以yyyyMMddHHmmss为格式的当前系统时间
     */
    public static String getOrderNum() {
	Date date = new Date();
	DateFormat df = new SimpleDateFormat(dtLong);
	return df.format(date);
    }

    /**
     * 年月日时分秒格式字符串转换成yyyyMMddHHmmss
    * @auth: 2017年8月24日上午9:59:38   LYJ
     */
    public static Date getDatePaser(String recourse) {
	DateFormat df = new SimpleDateFormat(dtLong);
	Date date = new Date();
	try {
	    date = df.parse(recourse);
	} catch (ParseException e) {
	    e.printStackTrace();
	}
	return date;
    }

    /**
     * 或许当前系统时间截取时分秒
     * @auth: 2017年5月27日下午2:05:50   LYJ
     */
    public static String getHMM() {
	String time = getOrderNum();
	int length = time.length();
	String t = time.substring(length - 6, length);
	return t;
    }

    /**
     * 格式：yyyy-MM-dd HH:mm:ss
     * @auth: 2017年5月27日下午2:06:04   LYJ
     */
    public static String getDateFormatter(Date date) {
	DateFormat df = new SimpleDateFormat(simple);
	return df.format(date);
    }
    /**
     * 解析：yyyy-MM-dd HH:mm:ss
     * @auth: 2017年5月27日下午2:06:04   LYJ
     */
    public static Date getDateFormatter(String recourse) {
    	DateFormat df = new SimpleDateFormat(simple);
    	try {
			return df.parse(recourse);
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	return null;
    }

    /**
     *当前日期， 格式：yyyy-MM-dd HH:mm:ss
     * @auth: 2017年5月27日下午2:06:04   LYJ
     */
    public static String getDateFormatter() {
	Date date = new Date();
	DateFormat df = new SimpleDateFormat(simple);
	return df.format(date);
    }

    /**
     * 获取系统当前日期(精确到分钟)，格式：yyyy-MM-dd HH:mm
     * @return
     */
    public static String getDateFormatters() {
	Date date = new Date();
	DateFormat df = new SimpleDateFormat(simples);
	return df.format(date);
    }

    /**
     *格式化：yyyy-MM-dd HH:mm
     * @return
     */
    public static String getDateFormatters(Date date) {
	DateFormat df = new SimpleDateFormat(simples);
	return df.format(date);
    }

    /**
     * 获取系统当期年月日(精确到天)，格式：yyyyMMdd
     * @return
     */
    public static String getDate() {
	Date date = new Date();
	DateFormat df = new SimpleDateFormat(dtShort);
	return df.format(date);
    }

    /**
     * 格式化：yyyyMMdd
     * @return
     * lyj
     */
    public static String getDate(Date date) {
	DateFormat df = new SimpleDateFormat(dtShort);
	return df.format(date);
    }

    /**
     * 解析：yyyyMMdd
     * @return
     * lyj
     */
    public static Date getDate(String date) {
	DateFormat df = new SimpleDateFormat(dtShort);
	try {
	    return df.parse(date);
	} catch (ParseException e) {
	    e.printStackTrace();
	}
	return null;
    }

    /**
     * 解析：yyyy-MM-dd
     * @return
     * lyj
     */
    public static String getDates(Date date) {
	DateFormat df = new SimpleDateFormat(dtsShort);
	return df.format(date);
    }

    /**
     * 格式化：yyyy-MM-dd
     * @return
     * lyj
     */
    public static Date getDates(String recourse) {
	DateFormat df = new SimpleDateFormat(dtsShort);
	try {
	    return df.parse(recourse);
	} catch (ParseException e) {
	    e.printStackTrace();
	}
	return null;
    }

    /**
     * 格式化：MM-dd HH:mm
     * @return
     * lyj
     */
    public static String getMDSM(Date date) {
	DateFormat df = new SimpleDateFormat(mdSM);
	return df.format(date);
    }

    // 增加或减少天数
    public static Date addDay(Date date, int num) {
	Calendar startDT = Calendar.getInstance();
	startDT.setTime(date);
	startDT.add(Calendar.DAY_OF_MONTH, num);
	return startDT.getTime();
    }

    /**
     * 产生随机的三位数
     * @auth: 2017年5月27日下午2:06:26   LYJ
     */
    public static String getThree() {
	Random rad = new Random();
	return rad.nextInt(1000) + "";
    }

    /**
     * 计算两个日期之间相差的天数
     *
     * @param smdate 较小的时间
     * @param bdate 较大的时间
     * @return 相差天数
     * @throws IllegalArgumentException
     * 	LYJ
     */
    public static int daysBetween(Date smdate, Date bdate) {
	try {
	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	    smdate = sdf.parse(sdf.format(smdate));
	    bdate = sdf.parse(sdf.format(bdate));
	    Calendar cal = Calendar.getInstance();
	    cal.setTime(smdate);
	    long time1 = cal.getTimeInMillis();
	    cal.setTime(bdate);
	    long time2 = cal.getTimeInMillis();
	    long between_days = (time2 - time1) / (1000 * 3600 * 24);

	    return Integer.parseInt(String.valueOf(between_days));
	} catch (ParseException e) {
	    throw new IllegalArgumentException(String.format("The input date string(%s) string(%s) is not valid.", smdate, bdate), e);
	}
    }

    /**
     * 计算日期是当前日期的前天，昨天，今天，明天，后天
     *
     * 
     * 要换算的日期
     * @return 前天，昨天，今天，明天，后天
     * @throws IllegalArgumentException
     * 	LYJ
     */
    public static String paseDate(Date thisDate) {
	String value = "";
	try {
	    Date date = new Date();
	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	    date = sdf.parse(sdf.format(date));// 当前日期
	    thisDate = sdf.parse(sdf.format(thisDate));// 要换算的日期
	    Calendar cal = Calendar.getInstance();
	    cal.setTime(date);
	    long time1 = cal.getTimeInMillis();
	    cal.setTime(thisDate);
	    long time2 = cal.getTimeInMillis();
	    long between_days = (time2 - time1) / (1000 * 3600 * 24);
	    int div = Integer.parseInt(String.valueOf(between_days));

	    if (div == 0) {
		value = "今天";
	    }
	    if (div == 1) {
		value = "明天";
	    }
	    if (div == 2) {
		value = "后天";
	    }
	    if (div == -1) {
		value = "昨天";
	    }
	    if (div == -2) {
		value = "前天";
	    }
	} catch (ParseException e) {
	    e.printStackTrace();
	}
	return value;
    }
}
